package main

import (
	"context"
	"flag"
	"os"
	"os/signal"
	"syscall"

	"mysql-mcp-server-go/internal/config"
	"mysql-mcp-server-go/internal/database"
	"mysql-mcp-server-go/internal/mcp"
	"mysql-mcp-server-go/pkg/logger"
)

// main 程序入口点
// 初始化配置、数据库连接和MCP服务器
func main() {
	// 解析命令行参数
	var configPath = flag.String("config", "", "配置文件路径")
	var debug = flag.Bool("debug", false, "启用调试模式")
	flag.Parse()

	// 初始化日志记录器
	log := logger.New(*debug)
	log.Info("启动 MySQL MCP Server")

	// 加载配置
	cfg, err := config.Load(*configPath)
	if err != nil {
		log.WithError(err).Fatal("加载配置失败")
	}

	// 初始化数据库连接
	db, err := database.NewWithFullConfig(cfg)
	if err != nil {
		log.WithError(err).Fatal("初始化数据库连接失败")
	}
	defer db.Close()

	// 创建MCP服务器
	server := mcp.NewServer(db, log)

	// 创建上下文用于优雅关闭
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

	// 监听系统信号
	sigChan := make(chan os.Signal, 1)
	signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)

	// 启动服务器
	go func() {
		if err := server.Start(ctx); err != nil {
			log.WithError(err).Fatal("启动MCP服务器失败")
		}
	}()

	log.Info("MySQL MCP Server 已启动")

	// 等待关闭信号
	<-sigChan
	log.Info("收到关闭信号，正在优雅关闭...")

	// 取消上下文，触发优雅关闭
	cancel()

	log.Info("MySQL MCP Server 已关闭")
}